home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / menubar1.arc / MENUBAR1.C
Text File  |  1986-04-04  |  8KB  |  208 lines

  1. /********************* menubar1.c *************************/
  2.  
  3. /*   experiments with a single level lotus type menu bar
  4. **   for those who want to save or unclutter screen space
  5. **   written in DeSmet C88 by Dieter Schweiss  2/13/85
  6. **   you are free to use and improve these functions,
  7. **   send any comments to:    Dieter Schweiss
  8.                               762 Larkwood Dr
  9.                               Holland, MI 49423
  10. */
  11.  
  12. #define CLS     scr_clr(); scr_rowcol(0,0)
  13. #define TRUE    1
  14. #define FALSE   0
  15. #define M1MAX   5          /* number of commands, change as needed */
  16.  
  17. main()       /* test the menu_bar1() function, remove main() */
  18. {            /* and go_on() and insert your own program      */
  19.   int command;
  20.  
  21.   CLS;
  22.   while (TRUE) {
  23.     scr_clr();
  24.     scr_rowcol(10,0);
  25.     command = menu_bar1();
  26.     switch (command) {
  27.      case 'R' : puts("\t Reading file");
  28.                 go_on(); break;
  29.      case 'W' : puts("\t Writing file");
  30.                 go_on(); break;
  31.      case 'P' : puts("\t Preparative display");
  32.                 go_on(); break;
  33.      case 'T' : puts("\t Tabular display");
  34.                 go_on(); break;
  35.      case 'Q' : puts("\t Do you want to exit program (y/n)? ");
  36.                 if (tolower(getchar()) == 'y') 
  37.                   exit();
  38.                 break;
  39.     }
  40.   }  /* endless while loop */
  41. }  
  42.  
  43. menu_bar1()  /* Generates a single level lotus like menu bar. Move */
  44.              /* left/right cursors to highlight command then press */
  45.              /* ENTER or type first letter of command. Returns the */
  46.              /* command letter. Change menu[], detail[] and switch */
  47.              /* /case constants for your own needs. For additional */
  48.              /* commands change M1MAX.                             */
  49.              /* Written in DeSmet C88 by Dieter Schweiss 2/13/85   */
  50. {
  51.   static char menu1[M1MAX][13] =
  52.     "Read ",
  53.     "Write ",
  54.     "Prep ",
  55.     "Table ",
  56.     "Quit";
  57.  
  58.   static char detail[M1MAX][61]  =
  59.     "Read a data file from disk",
  60.     "Write present data to disk",
  61.     "Display the data in a preparative format",
  62.     "Display the data in a tabular format",
  63.     "Quit the program and return to DOS";
  64.  
  65.   static char m1_tot[M1MAX * 12];  /* menu1 total string */
  66.  
  67.   char m1_let[M1MAX];              /* starting letters of menu1 */
  68.   int  m1_col[M1MAX];              /* starting columns of menu1 */
  69.   int  col;
  70.   int  row = 0;                    /* start at first row, change if needed */
  71.   int  black_w = 0x70;             /* black on white */
  72.   int  green_b = 0x02;             /* green on black */
  73.   int  k;
  74.   int  command1;                   /* letter of command */
  75.   char done;
  76.   char c;                          /* keyboard input */
  77.  
  78.   col = m1_tot[0] = 0;               /* reset */
  79.   for (k = 0; k < M1MAX; k++) {
  80.     strcat(m1_tot,menu1[k]);         /* form total menu string */
  81.     m1_col[k] = col;                 /* initialize location    */
  82.     m1_let[k] = menu1[k][0];         /* initial letter         */
  83.     col += strlen(menu1[k]);
  84.   }
  85.   col = k = 0;                       /* reset */
  86.   putsrcc(m1_tot,row,col,green_b);
  87.   menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  88.  
  89.   for ( ;; ) {
  90.     c = scr_ci();
  91.     if (c == 3) break;                      /* control C */
  92.     if (isalpha(c)) c = toupper(c);         /* convert to upper case */
  93.     done = FALSE;
  94.     switch (c) {
  95.       case 28 : k++;                        /* right arrow */
  96.                 if (k >= M1MAX) k = 0; 
  97.                 putsrcc(m1_tot,row,col,green_b);
  98.                 menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  99.                 break;
  100.       case 29 : k--;                        /* left arrow */
  101.                 if (k < 0) k = M1MAX -1;
  102.                 putsrcc(m1_tot,row,col,green_b);
  103.                 menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  104.                 break;
  105.       case 13 : command1 = m1_let[k];
  106.                 done = TRUE;
  107.                 break;
  108.       case 'R' : k = 0;            /* first command in menu1[] */
  109.                  command1 = m1_let[k];
  110.                  done = TRUE;
  111.                  putsrcc(m1_tot,row,col,green_b);
  112.                  menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  113.                  break;
  114.       case 'W' : k = 1;           /* second command in menu1[] */
  115.                  command1 = m1_let[k];
  116.                  done = TRUE;
  117.                  putsrcc(m1_tot,row,col,green_b);
  118.                  menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  119.                  break;
  120.       case 'P' : k = 2;           /* third command etc. */
  121.                  command1 = m1_let[k];
  122.                  done = TRUE;
  123.                  putsrcc(m1_tot,row,col,green_b);
  124.                  menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  125.                  break;
  126.       case 'T' : k = 3;
  127.                  command1 = m1_let[k];
  128.                  done = TRUE;
  129.                  putsrcc(m1_tot,row,col,green_b);
  130.                  menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  131.                  break;
  132.       case 'Q' : k = 4;                     /* fifth and last command */
  133.                  command1 = m1_let[k];      /* enter more if needed   */
  134.                  done = TRUE;
  135.                  putsrcc(m1_tot,row,col,green_b);
  136.                  menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
  137.                  break;
  138.  
  139.       default : putchar(7); break;
  140.     }
  141.     if (done) break;
  142.   } /* endless for loop */
  143.   return(command1);
  144. }
  145.  
  146. menu_bar2(command,detail,row,col,cmd_color,dtl_color) /* part of menu_bar1() */
  147.   char *command, *detail;
  148.   int  row, col;
  149.   int  cmd_color, dtl_color;
  150. {
  151.   static char blanks60[] =
  152.     "                                                            ";
  153.  
  154.   putsrcc(command,row,col,cmd_color);
  155.   putsrcc(blanks60,row+1,0,dtl_color);
  156.   putsrcc(detail,row+1,0,dtl_color);
  157.   return;
  158. }
  159.  
  160. putsrcc(string,row,col,color) /* print a string in color at given location */
  161.                               /* added screen_type() video mode detector  */
  162.   char string[];              /* DeSmet C88       Dieter Schweiss 2/13/85 */
  163.   int  row;                   /* 0 to 24 */
  164.   int  col;                   /* 0 to 79 */
  165.   int  color;                 /* eg. 0x1  to 0xF  = black background */
  166. {                             /* eg. 0x70 to 0x7E = white background */
  167.   int  len, k;
  168.   char str[160];              /* length of 1 row, includes attribute */
  169.   unsigned current_seg;
  170.   unsigned target_ofs, target_seg;
  171.  
  172.   target_seg  = screen_type() + row * 10;
  173.   target_ofs  = col * 2;             /* row has 160 bytes incl. attribute */
  174.   current_seg = _showds();
  175.   len         = 2 * strlen(string);
  176.   for (k = 0; k <= len; k++) {
  177.     if (k % 2)
  178.       str[k] = color;                /* odd elements are attributes */
  179.     else
  180.       str[k] = string[k/2];          /* even elements are ASCII values */
  181.   }
  182.   _lmove(len,str,current_seg,target_ofs,target_seg);  /* do it */
  183.   return;
  184. }
  185.  
  186. screen_type()         /* peek 0040:0010 for monitor adaptor type  */
  187.                       /* returns starting segment of screen       */
  188. {                     /* DeSmet C88 V 2.5  Dieter Schweiss 3/3/86 */
  189.  
  190.   if (((peek(0x10,0x40)) & 48) == 48)
  191.     return(0xB000);                 /* monochrome screen start-segment */
  192.   else
  193.     return(0xB800);                 /* color graphics adaptor assumed */
  194. }
  195.  
  196. go_on()
  197. {
  198.   int k, n;
  199.  
  200.   for (k = 1; k < 10; k++) {
  201.     putchar('.');
  202.     for (n = 1; n < 10000; n++);     /* delay */
  203.   }
  204.   puts("\t Press ENTER to go on .... ");
  205.   getchar();
  206.   return;
  207. }